﻿using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Vokabeltrainer
{
    public enum Status
    {
        Hinzufuegen,
        Abfrage,
    }
    public partial class Form1 : Form
    {
        Status status = Status.Hinzufuegen;
        VokabelStruct vokabelItem = new VokabelStruct();
        List<VokabelStruct> VokabelListe = new List<VokabelStruct>();
        List<VokabelStruct> Vokabeln = new List<VokabelStruct>();
        List<VokabelStruct> AntwortMoeglichkeitenDeutschListe = new List<VokabelStruct>();
        List<VokabelStruct> AntwortMoeglichkeitenRomajiListe = new List<VokabelStruct>();
        List<VokabelStruct> AntwortMoeglichkeitenHiraganaListe = new List<VokabelStruct>();
        List<VokabelStruct> AntwortMoeglichkeitenKataganaListe = new List<VokabelStruct>();
        List<VokabelStruct> FragenListe = new List<VokabelStruct>();
        List<VokabelStruct> RichtigListe = new List<VokabelStruct>();
        List<VokabelStruct> FalschListe = new List<VokabelStruct>();
        Random r=new Random();
        Tastatur t = new Tastatur();
        bool selberAntworten;
        int anzahl;
        int a;
        int RichtigeAntwort;

        public Loeschung SollLoeschen
        {
            get;
            set;
        }

        public Form1()
        {
            InitializeComponent();
            if (File.Exists("Daten/Daten.bin"))
                Laden();
            SollLoeschen = Loeschung.Keine;
            status = Status.Hinzufuegen;
            comboBox1.Items.Add(AntwortArt.Romaji.ToString());
            comboBox1.Items.Add(AntwortArt.Deutsch.ToString());
            comboBox1.Items.Add(AntwortArt.Hiragana.ToString());
            comboBox1.Items.Add(AntwortArt.Katagana.ToString());
            selberAntworten = true;
            pictureBox1.Image = Image.FromFile("Bilder/Beispiel.png");
            textBoxBildName.Text = "Beispiel.png";
            frage.Text = "which is a .....";
            antwort.Text = "glass";
        }

        private void Laden()
        {
            StreamReader sr = File.OpenText("Daten/Daten.bin");
            string line = "";
            string anLine = "";
            anLine = sr.ReadLine();
            anzahl = int.Parse(anLine);
            while (!sr.EndOfStream)
            {
                line = sr.ReadLine();

                vokabelItem.Frage = line.Split(':')[0];
                vokabelItem.Antwort = line.Split(':')[1];
                vokabelItem.Zusatz = line.Split(':')[2];
                vokabelItem.Bild = line.Split(':')[3];
                vokabelItem.AbfrageTag = int.Parse(line.Split(':')[4]);
                vokabelItem.Phase = int.Parse(line.Split(':')[5]);
                vokabelItem.JapZeichenInFrage = bool.Parse(line.Split(':')[6]);
                vokabelItem.JapZeichenInAntwort = bool.Parse(line.Split(':')[7]);
                vokabelItem.ArtDerAntwort = (AntwortArt)Enum.Parse(typeof(AntwortArt), line.Split(':')[8], false);

                VokabelListe.Add(vokabelItem);
                Vokabeln.Add(vokabelItem);
            }
            sr.Close();
        }

        private void Speichern()
        {
            StreamWriter sw = File.CreateText("Daten/Daten.bin");
            string line = "";
            line = anzahl.ToString();
            sw.WriteLine(line);
            for (int i = 0; i < VokabelListe.Count; i++)
            {
                line = VokabelListe[i].Frage + ":" +
                    VokabelListe[i].Antwort + ":" +
                    VokabelListe[i].Zusatz + ":" +
                    VokabelListe[i].Bild + ":" +
                    VokabelListe[i].AbfrageTag.ToString() + ":" +
                    VokabelListe[i].Phase.ToString() + ":" +
                    VokabelListe[i].JapZeichenInFrage.ToString() + ":" +
                    VokabelListe[i].JapZeichenInAntwort.ToString()+":"+
                    VokabelListe[i].ArtDerAntwort.ToString();

                sw.WriteLine(line);
            }
            sw.Close();
        }
        
        private void neuToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Warnung w = new Warnung(this);
            w.Show();
        }
        
        private void neuToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (VokabelListe.Count > 0)
            {
                status = Status.Abfrage;
                FragenListeFuellen();
                NaechsteFrage();
            }            
        }

        private void hinzufügenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            comboBox1.Items.Clear();
            status = Status.Hinzufuegen;
            comboBox1.Items.Add(AntwortArt.Romaji.ToString());
            comboBox1.Items.Add(AntwortArt.Deutsch.ToString());
            comboBox1.Items.Add(AntwortArt.Hiragana.ToString());
            comboBox1.Items.Add(AntwortArt.Katagana.ToString());
        }
        
        private void beendenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (FragenListe.Count > 0)
                VorzeitigerAbbruch();
            else
                Close();
        }

        private void comboBox1_DropDown(object sender, EventArgs e)
        {
            selberAntworten = false;
        }

        private void Update(object sender, EventArgs e)
        {
            if (SollLoeschen == Loeschung.Loeschen)
            { VokabelListe.Clear(); Vokabeln.Clear(); anzahl = 0; FragenListe.Clear(); RichtigListe.Clear(); FalschListe.Clear(); Speichern(); }
            else if (SollLoeschen == Loeschung.NichtLoeschen) { SollLoeschen = Loeschung.Keine; }
            switch (status)
            {
                case Status.Abfrage:
                    if (FragenListe.Count > 0)
                    {
                        label3.Visible = false; textBoxBildName.Visible = false; fragenJap.Visible = false; antwortJap.Visible = false; weiter.Text = "Weiter";
                        if (FragenListe[a].Zusatz != "") { label5.Visible = true; textBoxZusatz.Visible = true; }
                        else { label5.Visible = false; textBoxZusatz.Visible = false; }
                        if (selberAntworten) { antwort.Visible = true; label2.Visible = true; }
                        else { antwort.Visible = false; label2.Visible = false; }
                        comboBox1.Visible = true;
                        if (FragenListe[a].Bild == "Bilder/") { pictureBox1.Visible = false; }
                        else { pictureBox1.Visible = true; }
                    }
                    break;
                case Status.Hinzufuegen:
                    label3.Visible = true; textBoxBildName.Visible = true; fragenJap.Visible = true; antwortJap.Visible = true; weiter.Text = "Hinzufügen";
                    label5.Visible = true; textBoxZusatz.Visible = true; antwort.Visible = true; label2.Visible = true;
                    comboBox1.Visible = true; pictureBox1.Visible = true;

                    break;
            }
        }

        private void FragenListeFuellen()
        {
            for (int i = 0; i < VokabelListe.Count; i++)
            {
                switch (VokabelListe[i].ArtDerAntwort)
                {
                    case AntwortArt.Deutsch: AntwortMoeglichkeitenDeutschListe.Add(VokabelListe[i]); break;
                    case AntwortArt.Romaji: AntwortMoeglichkeitenRomajiListe.Add(VokabelListe[i]); break;
                    case AntwortArt.Hiragana: AntwortMoeglichkeitenHiraganaListe.Add(VokabelListe[i]); break;
                    case AntwortArt.Katagana: AntwortMoeglichkeitenKataganaListe.Add(VokabelListe[i]); break;
                }
                if (VokabelListe[i].AbfrageTag <= dateTimePicker1.Value.DayOfYear)
                {
                    FragenListe.Add(VokabelListe[i]);
                    VokabelListe.Remove(VokabelListe[i]);
                    i--;
                }
            }
        }

        private void DropDownBefuellen()
        {
            AntwortMoeglichkeitenDeutschListe.Clear();
            AntwortMoeglichkeitenRomajiListe.Clear();
            AntwortMoeglichkeitenHiraganaListe.Clear();
            AntwortMoeglichkeitenKataganaListe.Clear();

            for (int i = 0; i < Vokabeln.Count; i++)
            {
                switch (Vokabeln[i].ArtDerAntwort)
                {
                    case AntwortArt.Deutsch: AntwortMoeglichkeitenDeutschListe.Add(Vokabeln[i]); break;
                    case AntwortArt.Romaji: AntwortMoeglichkeitenRomajiListe.Add(Vokabeln[i]); break;
                    case AntwortArt.Hiragana: AntwortMoeglichkeitenHiraganaListe.Add(Vokabeln[i]); break;
                    case AntwortArt.Katagana: AntwortMoeglichkeitenKataganaListe.Add(Vokabeln[i]); break;
                }
            }
            comboBox1.Items.Clear();
            switch (FragenListe[a].ArtDerAntwort)
            {
                case AntwortArt.Deutsch:
                    comboBox1.Font = new Font("Microsoft Sans Serif", 9, FontStyle.Regular);
                    RichtigeAntwort = r.Next(0, 3);
                    for (int i = 0; i < 4; i++)
                    {
                        int zufall = r.Next(0, AntwortMoeglichkeitenDeutschListe.Count-1);
                        if (i != RichtigeAntwort)
                            comboBox1.Items.Add(AntwortMoeglichkeitenDeutschListe[zufall].Antwort);
                        else
                            comboBox1.Items.Add(FragenListe[a].Antwort);
                        AntwortMoeglichkeitenDeutschListe.Remove(AntwortMoeglichkeitenDeutschListe[zufall]);
                    }
                    break;
                case AntwortArt.Romaji:
                    RichtigeAntwort = r.Next(0, 3);
                    comboBox1.Font = new Font("Microsoft Sans Serif", 9, FontStyle.Regular);
                    for (int i = 0; i < 4; i++)
                    {
                        int zufall = r.Next(0, AntwortMoeglichkeitenRomajiListe.Count - 1);
                        if (i != RichtigeAntwort)
                            comboBox1.Items.Add(AntwortMoeglichkeitenRomajiListe[zufall].Antwort);
                        else
                            comboBox1.Items.Add(FragenListe[a].Antwort);
                        AntwortMoeglichkeitenRomajiListe.Remove(AntwortMoeglichkeitenRomajiListe[zufall]);
                    }
                    break;
                case AntwortArt.Hiragana:
                    RichtigeAntwort = r.Next(0, AntwortMoeglichkeitenHiraganaListe.Count - 1);
                    comboBox1.Font = new Font("MingLiU", 12, FontStyle.Regular);
                    for (int i = 0; i < 4; i++)
                    {
                        int zufall = r.Next(0, 3);
                        if (i != RichtigeAntwort)
                            comboBox1.Items.Add(AntwortMoeglichkeitenHiraganaListe[zufall].Antwort);
                        else
                            comboBox1.Items.Add(FragenListe[a].Antwort);
                        AntwortMoeglichkeitenHiraganaListe.Remove(AntwortMoeglichkeitenHiraganaListe[zufall]);
                    }
                    break;
                case AntwortArt.Katagana:
                    RichtigeAntwort = r.Next(0, 3);
                    comboBox1.Font = new Font("MingLiU", 12, FontStyle.Regular);
                    for (int i = 0; i < 4; i++)
                    {
                        int zufall = r.Next(0, AntwortMoeglichkeitenKataganaListe.Count - 1);
                        if (i != RichtigeAntwort)
                            comboBox1.Items.Add(AntwortMoeglichkeitenKataganaListe[zufall].Antwort);
                        else
                            comboBox1.Items.Add(FragenListe[a].Antwort);
                        AntwortMoeglichkeitenKataganaListe.Remove(AntwortMoeglichkeitenKataganaListe[zufall]);
                    }
                    break;
            }
        }

        private void Hinzufuegen()
        {
            if (FragenListe.Count > 0)
            {
                for (int i = FragenListe.Count - 1; i > 0; i--)
                {
                    VokabelListe.Add(FragenListe[i]);
                    FragenListe.Remove(FragenListe[i]);
                }
            }
            anzahl++;
            vokabelItem.Frage = frage.Text;
            vokabelItem.Antwort = antwort.Text;
            vokabelItem.Zusatz = textBoxZusatz.Text;
            vokabelItem.Bild = textBoxBildName.Text;
            vokabelItem.AbfrageTag = dateTimePicker1.Value.DayOfYear;
            vokabelItem.JapZeichenInAntwort = antwortJap.Checked;
            vokabelItem.JapZeichenInFrage = fragenJap.Checked;
            vokabelItem.Phase = 1;
            vokabelItem.ArtDerAntwort = (AntwortArt)Enum.Parse(typeof(AntwortArt), comboBox1.Text, false);

            VokabelListe.Add(vokabelItem);

            frage.Text = "";
            antwort.Text = "";
            textBoxZusatz.Text = "";
            textBoxBildName.Text = "";
            antwortJap.Checked = false;
            fragenJap.Checked = false;
            frage.Font = new Font("Microsoft Sans Serif", 9, FontStyle.Regular);
            antwort.Font = new Font("Microsoft Sans Serif", 9, FontStyle.Regular);
            Speichern();
        }

        private void NaechsteFrage()
        {
            a = r.Next(0, FragenListe.Count - 1);
            
            if (FragenListe[a].JapZeichenInFrage) frage.Font = new Font("MingLiU", 12, FontStyle.Regular);
            else frage.Font = new Font("Microsoft Sans Serif", 9, FontStyle.Regular);
            if (FragenListe[a].JapZeichenInAntwort) antwort.Font = new Font("MingLiU", 12, FontStyle.Regular);
            else antwort.Font = new Font("Microsoft Sans Serif", 9, FontStyle.Regular);
            frage.Text = FragenListe[a].Frage;
            DropDownBefuellen();
            if (FragenListe[a].Bild != "")
                pictureBox1.Image = Image.FromFile("Bilder/"+VokabelListe[a].Bild);
            textBoxZusatz.Text = FragenListe[a].Zusatz;
        }

        private void Pruefung()
        {
            vokabelItem.Frage = FragenListe[a].Frage;
            vokabelItem.Antwort = FragenListe[a].Antwort;
            vokabelItem.Zusatz = FragenListe[a].Zusatz;
            vokabelItem.Bild = FragenListe[a].Bild;
            vokabelItem.JapZeichenInAntwort = FragenListe[a].JapZeichenInAntwort;
            vokabelItem.JapZeichenInFrage = FragenListe[a].JapZeichenInFrage;
            vokabelItem.ArtDerAntwort = FragenListe[a].ArtDerAntwort;
            if (selberAntworten)
            {
                if (FragenListe[a].Antwort == antwort.Text)
                {
                    vokabelItem.AbfrageTag = dateTimePicker1.Value.DayOfYear + (FragenListe[a].Phase * 5);
                    vokabelItem.Phase = FragenListe[a].Phase + 1;

                    RichtigListe.Add(vokabelItem);
                }
                else
                {
                    vokabelItem.AbfrageTag = dateTimePicker1.Value.DayOfYear;
                    vokabelItem.Phase = 1;

                    FalschListe.Add(vokabelItem);
                }
            }
            else
            {
                if (FragenListe[a].Antwort == comboBox1.Text)
                {
                    vokabelItem.AbfrageTag = dateTimePicker1.Value.DayOfYear;
                    vokabelItem.Phase = 1;

                    RichtigListe.Add(vokabelItem);
                }
                else
                {
                    vokabelItem.AbfrageTag = dateTimePicker1.Value.DayOfYear;
                    vokabelItem.Phase = 1;

                    FalschListe.Add(vokabelItem);
                }
            }


            VokabelListe.Add(vokabelItem);

            selberAntworten = true;
            antwort.Text = "";
            comboBox1.Text = "Antwortmöglichkeiten";
            FragenListe.Remove(FragenListe[a]);

            if (FragenListe.Count == 0)
            {
                StreamWriter sw = File.CreateText("Auswertung.txt");
                string line = "";
                line = "Richtige Antworten";
                sw.WriteLine(line);
                for (int i = 0; i < RichtigListe.Count; i++)
                {
                    line = RichtigListe[i].Frage + ":" + RichtigListe[i].Zusatz + " = " + RichtigListe[i].Antwort;
                    sw.WriteLine(line);
                }
                line = "Falsche Antworten";
                sw.WriteLine(line);
                for (int i = 0; i < FalschListe.Count; i++)
                {
                    line = FalschListe[i].Frage + ":" + RichtigListe[i].Zusatz + " = " + FalschListe[i].Antwort;
                    sw.WriteLine(line);
                }
                sw.Close();
                Speichern();
                frage.Text = "Fertig";
            }
        }

        private void weiter_Click(object sender, EventArgs e)
        {
            if (status == Status.Abfrage)
            {
                Pruefung();
                if (FragenListe.Count > 0)
                    NaechsteFrage();
            }
            else
                if (frage.Text != "")
                    Hinzufuegen();
        }

        private void tastaturToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!t.Aktiv) { t.Show(); t.Aktiv = true; }
            else { t.Hide(); t.Aktiv = false; }
        }

        private void VorzeitigerAbbruch()
        {
            for (int i =FragenListe.Count-1; i >= 0 ; i--)
            {
                VokabelListe.Add(FragenListe[i]);
                FragenListe.Remove(FragenListe[i]);
            }
            if (VokabelListe.Count == anzahl)
            {
                StreamWriter sw = File.CreateText("Auswertung.txt");
                string line = "";
                line = "Richtige Antworten";
                sw.WriteLine(line);
                for (int i = 0; i < RichtigListe.Count; i++)
                {
                    line = RichtigListe[i].Frage + " = " + RichtigListe[i].Antwort;
                    sw.WriteLine(line);
                }
                line = "Falsche Antworten";
                sw.WriteLine(line);
                for (int i = 0; i < FalschListe.Count; i++)
                {
                    line = FalschListe[i].Frage + " = " + FalschListe[i].Antwort;
                    sw.WriteLine(line);
                }
                sw.Close();
                Speichern();
                Close();
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (FragenListe.Count > 0)
                VorzeitigerAbbruch();
            if (VokabelListe.Count != anzahl)
                e.Cancel = false;
        }

        private void fragenJap_CheckedChanged(object sender, EventArgs e)
        {
            if(fragenJap.Checked)
                frage.Font = new Font("MingLiU", 12, FontStyle.Regular);
            else
                frage.Font = new Font("Microsoft Sans Serif", 9, FontStyle.Regular);
        }

        private void antwortJap_CheckedChanged(object sender, EventArgs e)
        {
            if (antwortJap.Checked)
                antwort.Font = new Font("MingLiU", 12, FontStyle.Regular);
            else
                antwort.Font = new Font("Microsoft Sans Serif", 9, FontStyle.Regular);
        }

        private void hinweistextEinausToolStripMenuItem_Click(object sender, EventArgs e)
        {
            t.toolTip1.Active = !t.toolTip1.Active;
            toolTip1.Active = !toolTip1.Active;
        }
    }
}
